package com.norteksoft.product.mongo; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.UnknownHostException; import org.apache.commons.io.IOUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.bson.types.ObjectId; import com.mongodb.DB; import com.mongodb.Mongo; import com.mongodb.MongoException; import com.mongodb.gridfs.GridFS; import com.mongodb.gridfs.GridFSDBFile; import com.mongodb.gridfs.GridFSInputFile; public class MongoService { private String host; private int port; private String dbname; private String username; private String password; private Log logger = LogFactory.getLog(MongoService.class); private DB db = null; public DB getDb(){ if(db == null) db = getSingleDb(); return db; } public synchronized DB getSingleDb(){ try { Mongo mongo = new Mongo(host, port); DB db = mongo.getDB( dbname ); boolean auth = db.authenticate(username, password.toCharArray()); logger.debug("Mongo authenticate result : "+auth); if(auth) return db; throw new MongoException(" Can not connect to Mongo ..."); } catch (UnknownHostException e) { throw new MongoException(" unknown host ...", e); } catch (MongoException e) { throw new MongoException(" Mongo exception ...", e); } } /** * 保存文件 * @param file 文件 * @param fileName 文件名称 * @return 文件ID * @throws IOException */ public MongoFile saveFile(File file, String fileName) throws IOException { FileInputStream in = new FileInputStream(file); return saveFile(in, fileName); } /** * 保存文件 * @param in 文件输入流 * @param fileName 文件名称 * @return 文件ID * @throws IOException */ public MongoFile saveFile(InputStream in, String fileName) throws IOException { GridFS fs = new GridFS(getDb()); GridFSInputFile gridFile = fs.createFile(in, true); gridFile.setFilename(fileName); long chunkSize = GridFS.DEFAULT_CHUNKSIZE; if(in.available()>10*1024*1024){ chunkSize = 1024*1024; } gridFile.save(chunkSize); IOUtils.closeQuietly(in); MongoFile file = new MongoFile(gridFile.getId().toString(), gridFile.getFilename(), gridFile.getLength()); file.setFileType(gridFile.getContentType()); return file; } public MongoFile saveFile(byte[] fileBody, String fileName) throws IOException { return saveFile(new ByteArrayInputStream(fileBody), fileName); } public byte[] getFile(String fileId){ GridFS fs = new GridFS(getDb()); GridFSDBFile queryFile = fs.find(new ObjectId(fileId)); return getFile(queryFile); } private byte[] getFile(GridFSDBFile queryFile){ byte[] file = null; if(queryFile != null){ ByteArrayOutputStream bao = null; try { bao = new ByteArrayOutputStream(); queryFile.writeTo(bao); file = bao.toByteArray(); } catch (IOException e) { } finally{ IOUtils.closeQuietly(bao); } } return file; } public MongoFile copyFile(String fileId){ GridFS fs = new GridFS(getDb()); GridFSDBFile queryFile = fs.find(new ObjectId(fileId)); MongoFile file = null; if(queryFile != null){ logger.debug("query file info, fileId:"+queryFile.getId().toString()); GridFSInputFile gridFile = fs.createFile(getFile(queryFile)); gridFile.save(); file = new MongoFile(gridFile.getId().toString(), gridFile.getFilename(), gridFile.getLength()); logger.debug("copy file info : "+file); } return file; } public void writeTo(String fileId, OutputStream out) throws IOException{ GridFS fs = new GridFS(getDb()); GridFSDBFile queryFile = fs.find(new ObjectId(fileId)); //fs.findOne( new BasicDBObject( "_id" , new ObjectId("4ed5ef3a54c6baba1fb31a12")) ); logger.debug("query file info : "+queryFile); if(queryFile != null) queryFile.writeTo(out); } public void deleteFile(String fileId){ GridFS fs = new GridFS(getDb()); fs.remove(new ObjectId(fileId)); } public void setHost(String host) { this.host = host; } public void setPort(int port) { this.port = port; } public void setDbname(String dbname) { this.dbname = dbname; } public void setUsername(String username) { this.username = username; } public void setPassword(String password) { this.password = password; } public void setLogger(Log logger) { this.logger = logger; } }